package com.node.doubleStrands;

public class DNodes {
	/*
	 * 双链结构当线性集合，可以更加便捷的删除一个节点,删除中间任意节点无需重新排列
	 * [{<-上节点 节点1 下节点->},{<-上节点 节点2 下节点->},{<-上节点 节点3 下节点->},null]
	 */
	
	
	DNode head; // 头
	DNode last; // 尾
	
	public void add(Object value){
		// 添加时 一个节点要填充上下节点,设计思路与单链线性当一样,请先看com.node.line.LNodes
		DNode node = new DNode();
		node.value = value;
		if(head==null){
			head = node;
			last = node;
		}else{
			last.next = node;
			node.prev = last;
			last = node;
		}
	}
	// 移除指定节点并获取值
	public Object remove(int index){
		Object value = null;
		int i = 0;
		DNode nowNode = head; //当前选择节点
		while(i!=index&&nowNode!=null){
			nowNode = nowNode.next;
			i++;
		}
		if(nowNode != null){
			value = nowNode.value;
			// 移除节点
			DNode prev = nowNode.prev;// 获得节点当上节点
			DNode next = nowNode.next;
			// 移除节点 使将当前节点从链表中摘除,设计思路是考虑摘取其实就是将当前节点当上一节点与下一节点绑定即可，
			// 就好比ABC三个孩子手拉手，中间B的孩子离开了，其他两个孩子AC继续手拉手
			prev.next = next;  // A孩子拉上C的手
			next.prev = prev;  // C孩子拉上A的手
			
			nowNode.prev = null;// 这个B孩子离开了A
			nowNode.next = null;// 这个B孩子离开了C
		}
		return value;
	}
	
}
